import axios from "axios";
import { sha1 } from "js-sha1";

const AppId = "wx585fdac91f6e7e56";
const AppSecret = "b9c38c2465e66c6fd4a968c63cdee865";

export const getTimestamp = () => {
    return new Date().getTime() / 1000;
};

export const getRandomString = (len?: number) => {
    len = len || 16;
    let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
    let maxPos = $chars.length;
    let pwd = "";
    for (let i = 0; i < len; i++) {
        pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return pwd;
};
export const getSign = (timeStamp, randStr, url): Promise<any> => {
    return new Promise((resolve, reject) => {
        let access_token = localStorage.getItem("access_token");
        let ticket = localStorage.getItem("ticket");
        if (access_token && ticket) {
            let toSinStr = `jsapi_ticket=${ticket}&noncestr=${randStr}&timestamp=${timeStamp}&url=${url}`;
            let signStr = sha1(toSinStr);
            resolve(signStr);
        } else {
            //获取accessToken
            axios
                .get(
                    `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${AppId}&secret=${AppSecret}`
                )
                .then((res) => {
                    // alert(JSON.stringify(res));
                    console.log(JSON.stringify(res));
                    let access_token = res.data.access_token;
                    localStorage.setItem("access_token", access_token);
                    //获取jsapi_ticket
                    axios
                        .get(
                            `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi`
                        )
                        .then((res) => {
                            let ticket = res.data.ticket;
                            localStorage.setItem("ticket", ticket);
                            console.log(`wf---getjsapi_ticket--:${ticket}`);
                            //当前网页url
                            let str = `jsapi_ticket=${ticket}&noncestr=${randStr}&timestamp=${timeStamp}&url=${url}`;
                            //签名
                            let signStr = sha1(str);
                            resolve(signStr);
                            console.log(`wf---signStr--:${signStr}`);
                        })
                        .catch((e) => {
                            reject(e);
                            console.log(
                                `wf---getjsapi_ticket--error:${JSON.stringify(
                                    e
                                )}`
                            );
                        });
                })
                .catch((e) => {
                    console.log(`wf---getSign--error:${JSON.stringify(e)}`);
                    reject(e);
                });
        }
    });
};

/**
 * 获取微信配置
 * @param {*} tag 调用页面的this
 * @param {*} share_title 分享标题
 * @param {*} share_desc 分享描述
 * @param {*} share_link 分享链接
 * @param {*} share_cover 分享封面（配图）
 * @returns
 */
export const wxShare = async (
    tag: {
        $wx: {
            config: (arg0: {
                debug: boolean; // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: string; // 必填，公众号的唯一标识
                timestamp: any; // 必填，生成签名的时间戳
                nonceStr: any; // 必填，生成签名的随机串
                signature: any; // 必填，签名
                jsApiList: string[]; // 必填，需要使用的JS接口列表，注意查看官方文档，部分js接口即将废弃，我这里用的是新的
                openTagList: string[];
            }) => void;
            ready: (arg0: () => void) => void;
            updateAppMessageShareData: (arg0: {
                title: any; // 分享标题
                desc: any; // 分享描述
                link: string; // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: any; // 分享后显示的封面图
                success: () => void;
            }) => void;
            updateTimelineShareData: (arg0: {
                title: any; // 分享标题
                link: string; // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: any; // 分享图标
                success: () => void;
            }) => void;
            error: (arg0: (res: any) => void) => void;
        };
    },
    share_title: any,
    share_desc: any,
    share_link: any,
    share_cover: string
) => {
    var wx_host = window.location.href.split("#")[0]; //后端获取签名，需要前端传url，url要求看注解
    const cover =
        share_cover ||
        "https://hbimg.huaban.com/a2a9a71b293f6664b342e0cefc6e1fccd5f921f83cfa5-RoYLU8_fw658/format/webp"; //不重要的默认图片地址

    let randStr = getRandomString();
    let timeStamp = getTimestamp();
    let url = window.location.href.split("#")[0];
    let signStr = await getSign(timeStamp, randStr, url);
    return new Promise((resolve, reject) => {
        // getWechatConfig(wx_host).then((res) => {
        // if (res.code == 200) {
        const config = {
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
            appId: AppId, // 必填，公众号的唯一标识
            // timestamp: res.data.timestamp, // 必填，生成签名的时间戳
            // nonceStr: res.data.noncestr, // 必填，生成签名的随机串
            // signature: res.data.signature, // 必填，签名
            timestamp: timeStamp,
            nonceStr: randStr,
            signature: signStr,
            jsApiList: ["updateAppMessageShareData", "updateTimelineShareData"], // 必填，需要使用的JS接口列表，注意查看官方文档，部分js接口即将废弃，我这里用的是新的
            openTagList: ["wx-open-launch-weapp"], // 可选，需要使用的开放标签列表（当前标签用于跳转微信小程序）
        };
        tag.$wx.config(config); //通过config接口注入权限验证配置
        tag.$wx.ready(function () {
            //通过ready接口处理成功验证
            console.log("js-sdk配置成功！");

            //分享给朋友
            tag.$wx.updateAppMessageShareData({
                title: share_title || "默认标题", // 分享标题
                desc: share_desc || "默认描述", // 分享描述
                link: `${wx_host}#/${share_link}`, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: cover, // 分享后显示的封面图
                success: function () {
                    console.info("分享给朋友");
                }, // 设置成功回调
            });

            //分享到朋友圈
            tag.$wx.updateTimelineShareData({
                title: share_title || "默认标题", // 分享标题
                link: `${wx_host}#/${share_link}`, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: cover, // 分享图标
                success: function () {
                    // 用户点击了分享后执行的回调函数
                    console.info("分享到朋友圈");
                },
            });
            return resolve(true);
        });
        tag.$wx.error(function (res: any) {
            // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
            console.info("config信息验证失败");
            console.info(res);
            return reject(false);
        });
        // }
        // });
    });
};
